package destiny.预测;

import destiny.术数;
import destiny.common.阴阳;
import destiny.五行.五行;
import destiny.干.十神;
import destiny.干.天干;

public class 干数 extends 数 {
	/**
	 * 同性之生，其生力大于异性；生者减气，受生者得益。
	 * 
	 * 同性相克之力大于异性相克；相克均受损伤、受克损伤大；
	 */
	public static boolean 生克(干数 i, 干数 j) {
		return 生克(i, j, 1);
	}

	public static boolean 生克(干数 i, 干数 j, float 衰减) {

		术数 x = i.术数(), y = j.术数();
		if (x.五行().equals(y.五行()))
			return false;

		float a = i.weight, b = j.weight, c, d;

		if (x.五行().生().equals(y.五行()) || y.五行().生().equals(x.五行())) {
			// 反生为克，是指五行相生双方，主生者旺，被生者衰的现象。
			// 泄多为克，是指五行相生双方，被生者旺，主生者弱的现象。
			c = d = a > b ? b : a;
			c *= Consts.生主泄气;
			d *= Consts.生客得气;
		} else if (x.五行().克().equals(y.五行()) || y.五行().克().equals(x.五行())) {
			// 五行反克是指相克双方为主克者弱，被克者强的一种特殊现象。
			c = d = a > b ? b : a;
			c *= Consts.克主耗气;
			d *= Consts.克客失气;
		} else
			return false;

		if (!x.阴阳().equals(y.阴阳())) {
			c *= Consts.异性衰减;
			d *= Consts.异性衰减;
		}
		c *= 衰减;
		d *= 衰减;

		if (x.五行().生().equals(y.五行())) {
			a -= c;
			b += d;
		} else if (y.五行().生().equals(x.五行())) {
			b -= c;
			a += d;
		} else if (x.五行().克().equals(y.五行())) {
			a -= c;
			b -= d;
		} else if (y.五行().克().equals(x.五行())) {
			b -= c;
			a -= d;
		}

		// if (a < 0) a = 0;
		// if (b < 0) b = 0;

		i.weight = (int) a;
		j.weight = (int) b;

		return true;
	}

	private 天干 天干;

	private int 用神权重 = 0;
	private 十神 神 = null;

	private int weight;

	public 干数(天干 天干) {
		this(天干, Consts.四柱权重);
	}

	public 干数(天干 天干, int weight) {
		super(天干.术数());

		this.天干 = 天干;
		this.weight = weight;
	}

	void 用神权重(int 用神权重) {
		this.用神权重 = 用神权重;
	}

	public int 用神权重() {
		return 用神权重;
	}

	void 神(十神 神) {
		this.神 = 神;
	}

	public 十神 神() {
		return 神 == null ? 十神.NA : 神;
	}

	public int getWeight() {
		return weight;
	}

	public 天干 天干() {
		return 天干;
	}

	@Override
	public void 化(五行 ele) {
		化(ele, 术数.阴阳());
	}

	@Override
	void setWeight(int weight) {
		this.weight = weight;
	}

	@Override
	public void 化(五行 ele, 阴阳 yinYang) {
		术数 = new 术数(-1, ele, yinYang);
	}

	@Override
	public String _DEBUG() {
		return String.format("%s(%s)\t: %s(%d)", 天干, 天干.术数().五行(), 术数.五行(),
				getWeight());
	}
}
